/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.GrupoEtario;
import desarrollosoft.ghce.entidades.Monodroga;
import desarrollosoft.ghce.entidades.Sexo;
import desarrollosoft.ghce.servicio.interfaces.IServicioEstadisticas;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraRankingMedicamentosComunes extends SelectorComposer<Window> {
    
    @WireVariable("servicioEstadisticas")
    private IServicioEstadisticas servicioEstadisticas;
    
    @Wire
    private Combobox comboboxSexo;
    
    /*@Wire
    private Combobox comboboxEdadDesde;
    
    @Wire
    private Combobox comboboxEdadHasta;*/
    
    @Wire
    private Combobox comboboxGrupoEtario;
    
    @Wire
    private Combobox comboboxAnioDesde;
    
    @Wire
    private Combobox comboboxAnioHasta;
    
    @Wire
    private Combobox comboboxMesDesde;
    
    @Wire
    private Combobox comboboxMesHasta;
    
    @Wire
    private Listbox listboxMedicamentos;
    
    private List<Sexo> listaSexos;
    //private List<String> listaEdades;
    private List<GrupoEtario> listaGruposEtarios;
    private List<String> listaAnios;
    private List<String> listaMeses;
    
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        hacerAntesDeDibujar();
        super.doAfterCompose(comp);
        hacerDespuesDeDibujar();
    }
    
    private void hacerAntesDeDibujar() {
        // nada ??
    }
    
    private void hacerDespuesDeDibujar() {
        /* inicializo combo de sexos */
        listaSexos = servicioEstadisticas.obtenerTodosSexos();
        Sexo s = new Sexo();
        s.setId(-1L);
        s.setNombre("Ambos");
        listaSexos.add(0, s);
        comboboxSexo.setModel(new ListModelList<>(listaSexos));
        
        /* inicializo combos de edades */
        /*listaEdades = new ArrayList<>();
        for (int i = 0; i <= 130; i++) {
            listaEdades.add(String.valueOf(i));
        }
        comboboxEdadDesde.setModel(new ListModelList<>(listaEdades));
        comboboxEdadHasta.setModel(new ListModelList<>(listaEdades));*/
        
        listaGruposEtarios = servicioEstadisticas.obtenerTodosGruposEtarios();
        comboboxGrupoEtario.setModel(new ListModelList<>(listaGruposEtarios));
        
        /* inicializo combos de años */
        int anioMinimo = servicioEstadisticas.obtenerAnioMinimoElementos();
        int anioActual = servicioEstadisticas.obtenerAnioActual();
        
        listaAnios = new ArrayList<>();
        for (int i = anioMinimo; i <= anioActual; i++) {
            listaAnios.add(String.valueOf(i));
        }
        
        comboboxAnioDesde.setModel(new ListModelList<>(listaAnios));
        comboboxAnioHasta.setModel(new ListModelList<>(listaAnios));
        
        /* inicializo combos de meses */
        listaMeses = servicioEstadisticas.obtenerMeses();
        
        comboboxMesDesde.setModel(new ListModelList<>(listaMeses));
        comboboxMesHasta.setModel(new ListModelList<>(listaMeses));
    }
    
    @Listen("onClick = #botonCalcular")
    public void clickBotonCalcular() {
        Sexo sexoSeleccionado;
        int edadDesde;
        int edadHasta;
        int anioDesde;
        int anioHasta;
        int mesDesde;
        int mesHasta;
        
        if (validaElecciones() && validaRangos()) {
            int indiceSexo = comboboxSexo.getSelectedIndex();
            if (indiceSexo <= 0) {
                sexoSeleccionado = null;
            } else {
                sexoSeleccionado = listaSexos.get(indiceSexo);
            }
            edadDesde = listaGruposEtarios.get(comboboxGrupoEtario.getSelectedIndex()).getEdadMinima();
            edadHasta = listaGruposEtarios.get(comboboxGrupoEtario.getSelectedIndex()).getEdadMaxima();
            anioDesde = Integer.valueOf((String) comboboxAnioDesde.getSelectedItem().getValue() );
            anioHasta = Integer.valueOf((String) comboboxAnioHasta.getSelectedItem().getValue() );
            mesDesde = comboboxMesDesde.getSelectedIndex();
            mesHasta = comboboxMesHasta.getSelectedIndex();
            
            listboxMedicamentos.setModel(
                    new ListModelList<>(
                            servicioEstadisticas.obtenerMedicamentosMasComunes(
                                    sexoSeleccionado,
                                    edadDesde,
                                    edadHasta,
                                    anioDesde,
                                    anioHasta,
                                    mesDesde,
                                    mesHasta
                            )
                    )
            );
        } else {
            listboxMedicamentos.setModel(new ListModelList<>(new ArrayList<Monodroga>()));
        }
    }
    
    private boolean validaElecciones() {
        // si no valida, muestra cartel y devuelve false
        /*if (comboboxEdadDesde.getSelectedIndex() < 0 ) {
            Messagebox.show("Seleccione la lista desplegable Edad Desde");
            return false;
        }
        if (comboboxEdadHasta.getSelectedIndex() < 0 ) {
            Messagebox.show("Seleccione la lista desplegable Edad Hasta");
            return false;
        }*/
        
        if (comboboxGrupoEtario.getSelectedIndex() < 0) {
            Messagebox.show("Seleccione un Grupo Etario");
            return false;
        }
        
        if (comboboxAnioDesde.getSelectedIndex() < 0 ) {
            Messagebox.show("Seleccione la lista desplegable Año Desde");
            return false;
        }
        if (comboboxAnioHasta.getSelectedIndex() < 0 ) {
            Messagebox.show("Seleccione la lista desplegable Año Hasta");
            return false;
        }
        if (comboboxMesDesde.getSelectedIndex() < 0 ) {
            Messagebox.show("Seleccione la lista desplegable Mes Desde");
            return false;
        }
        if (comboboxMesHasta.getSelectedIndex() < 0 ) {
            Messagebox.show("Seleccione la lista desplegable Mes Hasta");
            return false;
        }
        return true;
    }
    
    private boolean validaRangos() {
        if (comboboxAnioDesde.getSelectedIndex() < comboboxAnioHasta.getSelectedIndex()) {
            return true;
        }
        if (comboboxAnioDesde.getSelectedIndex() == comboboxAnioHasta.getSelectedIndex()) {
            if (comboboxMesDesde.getSelectedIndex() <= comboboxMesHasta.getSelectedIndex()) {
                return true;
            } else {
                Messagebox.show("El Mes Desde, debe ser menor o igual (<=) que el Mes Hasta");
                return false;
            }
        } else {
            Messagebox.show("El Año Desde, debe ser menor o igual (<=) que el Año Hasta");
            return false;
        }
    }
}
